﻿using System;
using System.Linq;
using System.Web.Mvc;
using ContactManagement.AppCode;
using ContactManagement.Models;
using ContactMvc4TB.Helpers.HelperClasses;
using EFDataModel;
using EFDataModel.Enums;

namespace ContactMvc4TB.Helpers.CategoryManagement
{
    /// <summary>
    /// Verarbeiten der Benutzerkategorien wie Hinzufügen, Bearbeiten oder Löschen
    /// </summary>
    public class WebUserCategories : CategoryBase
    {
        #region Static
        /// <summary>
        /// Singleton Pattern für die aktuelle WebUserCategorie
        /// </summary>
        /// <param name="controller">Der Aktuelle CurrentController</param>
        /// <returns>Instanz der aktuellen WebUserKategorie</returns>
        public static WebUserCategories UserCategories(Controller controller)
        {
            return new WebUserCategories(controller);
        }
        #endregion

        #region Member
        /// <summary>
        /// Der Aktuelle CurrentController, damit auch auf die Tempdaten und alles notwendige zugegriffen werden kann
        /// </summary>
        protected override sealed Controller CurrentController { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Initialisieren der WebUserKategorien
        /// </summary>
        /// <param name="controller"></param>
        public WebUserCategories(Controller controller)
        {
            CurrentController = controller;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Hinzufügen eines Eintrages zur Kategorie
        /// </summary>
        /// <param name="model"></param>
        /// <returns>TRUE->Erfolgreich angelegt | FALSE->Fehler beim Löschen</returns>
        public override bool Add(CategoriesAddModel model)
        {
            try
            {
                //Erstellen und Speichern des Eintrages
                UserCategory userCategory = new UserCategory();
                userCategory.IsSystem = false;
                userCategory.Name = model.Name;
                userCategory.SortId = model.SortId;
                userCategory.EFCategoryType = EFCategoryTypes.UserCategory;
                CurrentHttpContext.GetDataModel().EFCategoryMenge.Add(userCategory);
                CurrentHttpContext.GetDataModel().SaveChanges();
            }
            catch (Exception)
            {
                //Fehler Beim Anlegen des Eintrags
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.AddValueErrorRESX, MessageTypes.error);
                return false;
            }

            //Der Eintrag konnte erfolgreich angelegt werden
            CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.AddValueSuccessfullRESX, MessageTypes.ok);
            return true;
        }

        /// <summary>
        /// Löschen der übergebenen Kategorie Id
        /// </summary>
        /// <param name="id">die Kategorie Id die gelöscht werden soll</param>
        /// <returns>TRUE->Erfolgreich gelöscht | FALSE->Fehler beim Löschen</returns>
        public override bool Delete(int id)
        {
            //Prüfen ob einem User die Kategorie zugeordnet ist, wenn nicht kann diese gelöscht werden.
            var userCount = (from eUser in CurrentHttpContext.GetDataModel().EFBaseMenge.OfType<EFUser>() where eUser.UserCategoryID == id select eUser.ID).Count();

            if (userCount == 0)
            {
                UserCategory userCategory = (UserCategory)CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id);
                if (userCategory != null)
                {
                    if (!userCategory.IsSystem)
                    {
                        CurrentHttpContext.GetDataModel().EFCategoryMenge.Remove(userCategory);
                        CurrentHttpContext.GetDataModel().SaveChanges();

                        //anzeigen das die Kategorie erfolgreich gelöscht wurde
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.DeleteSuccessFullRESX, MessageTypes.ok);
                        return true;
                    }
                    else
                    {
                        //Fehler anzeigen das die Kategorie nicht gelöscht werden kann, da es sich um eine Systemkategorie handelt.
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.SystemValuesCanNotBeDeletedRESX, MessageTypes.error);
                    }
                }
            }
            else
            {
                //Fehler anzeigen das die Kategorie nicht gelöscht werden kann.
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.CategoryInUserErrorRESX, MessageTypes.error);
            }

            return false;
        }

        /// <summary>
        /// Bearbeiten der übergebenen Kategorie Id
        /// </summary>
        /// <param name="id">Kategorie Id die bearbeitet werden soll</param>
        /// <returns>das passende Model mit den hinterlegten Daten aus der DB | Null bei einem Fehler</returns>
        public override CategoriesAddModel Edit(int id)
        {
            //Laden der übergebenen Kategorie
            UserCategory userCategory = (UserCategory) CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id);

            if (userCategory != null)
            {
                //Füllen des Modells mit den Daten und diese werden dann zurück gegeben und auf der Webseite angezeigt
                CategoriesAddModel categoriesAddModel = new CategoriesAddModel();
                categoriesAddModel.Name = userCategory.Name;
                categoriesAddModel.SortId = userCategory.SortId;
                return categoriesAddModel;
            }
            else
            {
                //Wenn ein Fehler beim Laden auftritt diesen anzeigen
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.LoadErrorRESX, MessageTypes.error);
            }

            return null;
        }

        /// <summary>
        /// Speichern der übergebenen Daten des geänderten Modells
        /// </summary>
        /// <param name="id">id die geändert werden soll</param>
        /// <param name="model">das Model mit den Daten die geändert werden sollen</param>
        /// <returns>TRUE->Änderung erfolgreich | FALSE->Daten konnten nicht geändert werden</returns>
        public override bool Edit(int id, CategoriesAddModel model)
        {
            //Laden der übergebenen Kategorie
            UserCategory userCategory = (UserCategory) CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(id);
            if (userCategory != null)
            {
                //die geladene Kategorie mit den Daten aus dem Model updaten und speichern
                userCategory.Name = model.Name;
                userCategory.SortId = model.SortId;
                CurrentHttpContext.GetDataModel().SaveChanges();
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.SaveSuccessfullRESX, MessageTypes.ok);
                return true;
            }
            else
            {
                //Wenn ein Fehler beim Laden auftritt diesen anzeigen
                CustomMessage.CurrentMessage(CurrentController).AddMessage(GlobalResources.SystemMessages.LoadErrorRESX, MessageTypes.error);
            }

            return false;
        }

        #endregion
    }
}